package br.com.toscano.contpedido.view;

import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;

import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;
import javax.inject.Inject;
import javax.servlet.http.HttpServletRequest;

import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.usermodel.Row;

import br.com.toscano.contpedido.business.ClienteBC;
import br.com.toscano.contpedido.business.PedidoBC;
import br.com.toscano.contpedido.business.ProdutoBC;
import br.com.toscano.contpedido.business.StatusPedidoBC;
import br.com.toscano.contpedido.business.UsuarioBC;
import br.com.toscano.contpedido.constant.ConstantesMensagem;
import br.com.toscano.contpedido.domain.Cliente;
import br.com.toscano.contpedido.domain.ContextoUsuario;
import br.com.toscano.contpedido.domain.Perfil;
import br.com.toscano.contpedido.domain.Produto;
import br.com.toscano.contpedido.domain.StatusPedido;
import br.com.toscano.contpedido.domain.Usuario;
import br.com.toscano.contpedido.otd.PedidoConsolidado;
import br.com.toscano.contpedido.view.converter.DateConverter;
import br.gov.frameworkdemoiselle.annotation.NextView;
import br.gov.frameworkdemoiselle.annotation.PreviousView;
import br.gov.frameworkdemoiselle.stereotype.ViewController;
import br.gov.frameworkdemoiselle.template.AbstractListPageBean;
import br.gov.frameworkdemoiselle.transaction.Transactional;


@ViewController
@NextView("./pedido_relatorio_consolidado.jsf")
@PreviousView("./pedido_relatorio_consolidado.jsf")
public class PedidoRelatorioConsolidadoMB extends AbstractListPageBean<PedidoConsolidado, Long> {

	private static final long serialVersionUID = 1L;

	@Inject
	private PedidoBC pedidoBC;
	
	@Inject
	private UsuarioBC usuarioBC;
	private List<SelectItem> usuarios;
	private Long usuario;

	public List<SelectItem> getUsuarios() {
		usuarios = new ArrayList<SelectItem>();
		boolean admin = false;
		ContextoUsuario usuario = (ContextoUsuario)FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get(ConstantesMensagem.CONTEXTO_USUARIO_SESSAO);
		if (usuario != null) {
			for (Perfil perfil :usuario.getUsuario().getListaPerfil()) {
				if (perfil.getId().equals(Perfil.PERFIL_ADM)){
					admin = true;
				}
			}
			
		}
		if (admin) {
			List<Usuario> lista = usuarioBC.findAll();
			for (Usuario obj: lista) {
				usuarios.add(new SelectItem(obj.getId() , obj.getNome()));
			}
		} else {
			usuarios.add(new SelectItem(usuario.getUsuario().getId() , usuario.getUsuario().getNome()));
		}
		return usuarios;
	}

	public void setUsuarios(List<SelectItem> usuarios) {
		this.usuarios = usuarios;
	}

	public Long getUsuario() {
		return usuario;
	}

	public void setUsuario(Long usuario) {
		this.usuario = usuario;
	}

	
	private Date dataCadastroInicial;
	private Date dataCadastroFinal;
	private Date dataEntregaInicial;
	private Date dataEntregaFinal;
	
	@Inject
	private ClienteBC clienteBC;
	private List<SelectItem> clientes;
	private Long cliente;

	@Inject
	private ProdutoBC produtoBC;
	private List<SelectItem> produtos;
	private Long produto;

	@Inject
	private StatusPedidoBC statusPedidoBC;
	private List<SelectItem> statusPedidos;

	public List<SelectItem> getStatusPedidos() {
		statusPedidos = new ArrayList<SelectItem>();
		List<StatusPedido> lista = statusPedidoBC.findAll();
		for (StatusPedido obj: lista) {
			statusPedidos.add(new SelectItem(obj.getId() , obj.getDescricao()));
		}

		return statusPedidos;
	}

	public void setStatusPedidos(List<SelectItem> statusPedidos) {
		this.statusPedidos = statusPedidos;
	}

	public Long getStatusPedido() {
		return statusPedido;
	}

	public void setStatusPedido(Long statusPedido) {
		this.statusPedido = statusPedido;
	}

	private Long statusPedido;

	public List<SelectItem> getClientes() {
		clientes = new ArrayList<SelectItem>();
		List<Cliente> lista = clienteBC.findAll();
		for (Cliente obj: lista) {
			clientes.add(new SelectItem(obj.getId() , obj.getNome()));
		}
		return clientes;
	}

	public void setClientes(List<SelectItem> clientes) {
		this.clientes = clientes;
	}

	public Long getCliente() {
		return cliente;
	}

	public void setCliente(Long cliente) {
		this.cliente = cliente;
	}

	public List<SelectItem> getProdutos() {
		produtos = new ArrayList<SelectItem>();
		List<Produto> lista = produtoBC.findAll();
		for (Produto obj: lista) {
			clientes.add(new SelectItem(obj.getId() , obj.getUnidadeMedida().getSigla()  + " - " + obj.getDescricao()));
		}
		return produtos;
	}

	public void setProdutos(List<SelectItem> produtos) {
		this.produtos = produtos;
	}

	public Long getProduto() {
		return produto;
	}

	public void setProduto(Long produto) {
		this.produto = produto;
	}
	
	public Date getDataCadastroInicial() {
		return dataCadastroInicial;
	}

	public void setDataCadastroInicial(Date dataCadastroInicial) {
		this.dataCadastroInicial = dataCadastroInicial;
	}

	public Date getDataCadastroFinal() {
		return dataCadastroFinal;
	}

	public void setDataCadastroFinal(Date dataCadastroFinal) {
		this.dataCadastroFinal = dataCadastroFinal;
	}

	public Date getDataEntregaInicial() {
		return dataEntregaInicial;
	}

	public void setDataEntregaInicial(Date dataEntregaInicial) {
		this.dataEntregaInicial = dataEntregaInicial;
	}

	public Date getDataEntregaFinal() {
		return dataEntregaFinal;
	}

	public void setDataEntregaFinal(Date dataEntregaFinal) {
		this.dataEntregaFinal = dataEntregaFinal;
	}


	public void postProcessXLS(Object document) {
		
		HSSFWorkbook wb = (HSSFWorkbook) document;
		HSSFSheet sheet = wb.getSheetAt(0);
		
		/******************** HEADER **********************/		
		CellStyle headerStyle = wb.createCellStyle();
		Font headerFont = wb.createFont();
		headerFont.setBoldweight(Font.BOLDWEIGHT_BOLD);
		headerFont.setColor(HSSFColor.BLUE.index);
		headerStyle.setFont(headerFont);
		headerStyle.setAlignment(CellStyle.ALIGN_CENTER);
		 
		Row headerRow = sheet.getRow(0);
		int cont = 0; 
		for (Cell cell : headerRow) {
			cell.setCellStyle(headerStyle);
			if (0 == cont) {
				cell.setCellValue("");
			} else if (cont ==1) {
				cell.setCellValue("Total de Pedidos");
			} else if (cont ==2) {
				cell.setCellValue("Total Cancelado");
			} else if (cont ==3) {
				cell.setCellValue("Total Engregues");
			} else if (cont ==4) {
				cell.setCellValue("Total Pagos");
			}
			cont++;
		}
		
		/******************** TOTAL **********************/
		CellStyle style = wb.createCellStyle();
		Font font = wb.createFont();
		font.setBoldweight(Font.BOLDWEIGHT_BOLD);
//		font.setColor(HSSFColor.ORANGE.index); 
		style.setFont(font);
		style.setAlignment(CellStyle.ALIGN_RIGHT);
//		Row totalRow = sheet.createRow(sheet.getLastRowNum()+2);
//		Cell cell1 = totalRow.createCell(6);
//		cell1.setCellValue("Total");
//		cell1.setCellStyle(style);
//		Cell cell2 = totalRow.createCell(7);
//		
//		BigDecimal valor = BigDecimal.ZERO;
//		List<PedidoConsolidado> pedidos = this.getResultList();
//		for (PedidoConsolidado pedido : pedidos) {
//			valor = valor.add(pedido.getValorTotalPedido());
//		}
//		
//		cell2.setCellFormula(valor.toString());
//		
//		cell2.setCellStyle(style);

		//Ajuste do tamanho das colunas
		sheet.autoSizeColumn(0);
		sheet.autoSizeColumn(1);
		sheet.autoSizeColumn(2);
		sheet.autoSizeColumn(3);
	}
	

	public void filtrar() {
		super.clear();
		super.getDataModel();
	}
	
	protected List<PedidoConsolidado> handleResultList() {

		this.setStatusPedido(null);
		this.setCliente(null);
		setDataCadastroInicial(null);
		setDataCadastroFinal(null);
		setDataEntregaInicial(null);
		setDataEntregaFinal(null);
		setDataEntregaInicial(null);
		setDataEntregaFinal(null);
		
		boolean admin = false;
		ContextoUsuario usuario = (ContextoUsuario)FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get(ConstantesMensagem.CONTEXTO_USUARIO_SESSAO);
		if (usuario != null) {
			for (Perfil perfil :usuario.getUsuario().getListaPerfil()) {
				if (perfil.getId().equals(Perfil.PERFIL_ADM)){
					admin = true;
				}
			}
			
		}
		
		HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();    
		if (request.getParameter("statusPedido") != null && !"".equals(request.getParameter("statusPedido")))
			this.setStatusPedido(new Long(request.getParameter("statusPedido")));

		if (!admin) {
			this.setUsuario(usuario.getUsuario().getId());
		} else {
			if (request.getParameter("usuario") != null && !"".equals(request.getParameter("usuario")))
				this.setUsuario(new Long(request.getParameter("usuario")));
		}
		
		
		if (request.getParameter("cliente") != null && !"".equals(request.getParameter("cliente")))	
				this.setCliente(new Long(request.getParameter("cliente")));
		
		if (request.getParameter("dataCadastroInicial_input") != null && !"".equals(request.getParameter("dataCadastroInicial_input")))	{
			setDataCadastroInicial(DateConverter.getDate(request.getParameter("dataCadastroInicial_input")));
		}

		if (request.getParameter("dataCadastroFinal_input") != null && !"".equals(request.getParameter("dataCadastroFinal_input")))	{
			setDataCadastroFinal(DateConverter.getDate(request.getParameter("dataCadastroFinal_input")));
		}

		if (request.getParameter("dataEntregaInicial_input") != null && !"".equals(request.getParameter("dataEntregaInicial_input")))	{
			setDataEntregaInicial(DateConverter.getDate(request.getParameter("dataEntregaInicial_input")));
		}

		if (request.getParameter("dataEntregaFinal_input") != null && !"".equals(request.getParameter("dataEntregaFinal_input")))	{
			setDataEntregaFinal(DateConverter.getDate(request.getParameter("dataEntregaFinal_input")));
		}

		if (request.getParameter("dataEntregaInicial_input") != null && !"".equals(request.getParameter("dataEntregaInicial_input")))	{
			setDataEntregaInicial(DateConverter.getDate(request.getParameter("dataEntregaInicial_input")));
		}

		if (request.getParameter("dataEntregaFinal_input") != null && !"".equals(request.getParameter("dataEntregaFinal_input")))	{
			setDataEntregaFinal(DateConverter.getDate(request.getParameter("dataEntregaFinal_input")));
		}

		PedidoConsolidado pedidoConsolidado = this.pedidoBC.consultarPedidosConsolidado(null, cliente, this.usuario, statusPedido, dataCadastroInicial, dataCadastroFinal, dataEntregaInicial, dataEntregaFinal);
		
		ArrayList<PedidoConsolidado> retorno = new ArrayList<PedidoConsolidado>();
		retorno.add(pedidoConsolidado);
		
		return retorno;
	}
	
	@Transactional
	public String deleteSelection() {
		boolean delete;
		for (Iterator<Long> iter = getSelection().keySet().iterator(); iter.hasNext();) {
			Long id = iter.next();
			delete = getSelection().get(id);
			if (delete) {
				pedidoBC.delete(id);
				iter.remove();
			}
		}
		return getPreviousView();
	}

	
}